home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / obrn-a_1.5_src.lha / oberon-a / source3.lha / Source / OBumpRev / OBumpRev.mod < prev    next >
Encoding:
Text File  |  1995-01-23  |  10.3 KB  |  332 lines

  1. (*
  2.  *      $DESCRIPTION: Bumps Oberon-A module revisions $
  3.  *      $AUTHOR: Johan Ferreira $
  4.  *)
  5.  
  6. <*STANDARD-*>
  7.  
  8. MODULE  OBumpRev;
  9.  
  10. IMPORT  SYSTEM, Exec, Dos, Timer, Utility, IO := BufIO, Strings, OBumpRevRev, Msg := OBumpRevMsg, Kernel;
  11.  
  12.  
  13. CONST   moduleOpt = 0;
  14.         versionOpt = 1;
  15.         revisionOpt = 2;
  16.         logExtOpt = 3;
  17.         revModExtOpt = 4;
  18.         modExtOpt = 5;
  19.         noLogOpt = 6;
  20.         dateOnlyOpt = 7; (* added by fjc *)
  21.         numOfArgs = 8;
  22.  
  23.         defLogExt = ".revlog";
  24.         defRevModExt = "Rev.mod";
  25.         defModExt = ".mod";
  26.         defDateOnly = FALSE; (* added by fjc *)
  27.  
  28.         programName = "OBumpRev";
  29.  
  30.  
  31. TYPE    LongIntPtr = POINTER [2] TO ARRAY 1 OF LONGINT;
  32.  
  33.  
  34. VAR     modrevfh, logfh, modfh: Dos.FileHandlePtr;
  35.  
  36.         author, logname, module, logext, modrevext, modext: Exec.LSTRPTR;
  37.         day, month, year: LONGINT;
  38.         version, revision: LONGINT;
  39.         dateOnly : BOOLEAN; (* added by fjc *)
  40.  
  41.         argarray: ARRAY numOfArgs OF SYSTEM.LONGWORD;
  42.         argresult: Dos.RDArgsPtr;
  43.         prgname: Exec.LSTRPTR;
  44.         cleanup: PROCEDURE (rc: LONGINT);
  45.  
  46.         bool, modrevexists, nolog: BOOLEAN;
  47.         ch: CHAR;
  48.         li: LONGINT;
  49.         liptr: LongIntPtr;
  50.         strptr: Exec.LSTRPTR;
  51.  
  52.  
  53. PROCEDURE ReadLongInt* (fh: Dos.FileHandlePtr; VAR x: LONGINT): BOOLEAN;
  54. VAR     ch: CHAR;
  55.         d: LONGINT;
  56.         neg: BOOLEAN;
  57. BEGIN
  58.         x := 0; IO.Read (fh, ch);
  59.         neg := FALSE;
  60.         IF ch = "-" THEN neg := TRUE; IO.Read (fh, ch) END;
  61.         LOOP
  62.                 CASE ch OF
  63.                         0X, ";": IF neg THEN x := -x END; RETURN TRUE
  64.                 |        "0".."9":
  65.                                 d := ORD (ch) - ORD ("0");
  66.                                 IF (MAX (LONGINT) - d) DIV 10 >= x THEN x := 10*x+d ELSE EXIT END
  67.                 ELSE        EXIT
  68.                 END;
  69.                 IO.Read (fh, ch);
  70.         END;
  71.         RETURN FALSE;
  72. END ReadLongInt;
  73.  
  74.  
  75. PROCEDURE PrintFault (msg: LONGINT);
  76. BEGIN
  77.         strptr := Msg.GetString (msg);
  78.         IF msg = 0 THEN
  79.                 IF Dos.PrintFault (Dos.IoErr (), prgname^) THEN END
  80.         ELSE
  81.                 IO.WriteF1 (NIL, strptr^, prgname)
  82.         END
  83. END PrintFault;
  84.  
  85.  
  86. PROCEDURE OpenFile (VAR fh: Dos.FileHandlePtr; mode: LONGINT; name, extension: Exec.LSTRPTR);
  87. VAR     filename: Exec.LSTRPTR;
  88. BEGIN
  89.         SYSTEM.NEW (filename, 32);
  90.         COPY (name^, filename^); Strings.Append (extension^, filename^);
  91.         fh := Dos.Open (filename^, mode)
  92. END OpenFile;
  93.  
  94.  
  95. PROCEDURE CloseFile (VAR fh: Dos.FileHandlePtr; halt: BOOLEAN);
  96. BEGIN
  97.         IF fh # NIL THEN
  98.                 IF ~ Dos.Close (fh) THEN
  99.                         fh := NIL;
  100.                         PrintFault (Msg.msgCouldNotClose);
  101.                         IF halt THEN HALT (Dos.error) END
  102.                 END;
  103.                 fh := NIL
  104.         END;
  105. END CloseFile;
  106.  
  107.  
  108. PROCEDURE WriteRevMod ();
  109. BEGIN
  110.         OpenFile (modrevfh, Dos.newFile, module, modrevext);
  111.         IF modrevfh = NIL THEN
  112.                 PrintFault (Msg.msgCouldNotCreateModRev);
  113.                 HALT (Dos.fail)
  114.         ELSE
  115.                 IF ~ modrevexists THEN
  116.                         strptr := Msg.GetString (Msg.msgCreated);
  117.                         IO.WriteF3 (NIL, strptr^, prgname, module, modrevext)
  118.                 END
  119.         END;
  120.  
  121.         strptr := Msg.GetString (Msg.msgRevModContents);
  122.         IF Dos.FPrintf (modrevfh, strptr^,
  123.                                 SYSTEM.ADR (OBumpRevRev.vers),
  124.                                 module,
  125.                                 version,
  126.                                 revision,
  127.                                 day,month,year,
  128.                                 module,version,revision,
  129.                                 module,version,revision,day,month,year,
  130.                                 module,version,revision,day,month,year,
  131.                                 module) = -1 THEN
  132.                 PrintFault (Msg.msgCouldNotWriteModRev);
  133.                 HALT (Dos.fail)
  134.         END;
  135.  
  136.         CloseFile (modrevfh, TRUE)
  137. END WriteRevMod;
  138.  
  139.  
  140. PROCEDURE WriteLog();
  141. VAR        modsize: LONGINT;
  142. BEGIN
  143.         (* Open log file *)
  144.         OpenFile (logfh, Dos.readWrite, module, logext);
  145.         IF logfh = NIL THEN
  146.                 OpenFile (logfh, Dos.newFile, module, logext);
  147.                 IF logfh = NIL THEN
  148.                         strptr := Msg.GetString (Msg.msgCouldNotCreate);
  149.                         IO.WriteF3 (NIL, strptr^, prgname, module, logext)
  150.                 ELSE
  151.                         strptr := Msg.GetString (Msg.msgCreated);
  152.                         IO.WriteF3 (NIL, strptr^, prgname, module, logext)
  153.                 END
  154.         END;
  155.  
  156.         (* Write log *)
  157.         IF logfh # NIL THEN
  158.  
  159.                 (* Get #?.mod size *)
  160.                 OpenFile (modfh, Dos.oldFile, module, modext);
  161.                 IF modfh # NIL THEN
  162.                         modsize := Dos.Seek (modfh, 0, Dos.end);
  163.                         modsize := Dos.Seek (modfh, 0, Dos.end);
  164.                         CloseFile (modfh, TRUE)
  165.                 ELSE
  166.                         modsize := 0
  167.                 END;
  168.  
  169.                 strptr := Msg.GetString (Msg.msgAuthor);
  170.                 IF Dos.GetVar (strptr^, author^, 30, {}) = -1 THEN author := SYSTEM.ADR ("") END;
  171.  
  172.                 li := Dos.Seek (logfh, 0, Dos.end);        (* Append *)
  173.                 strptr := Msg.GetString (Msg.msgLog);
  174.                 IF Dos.FPrintf (logfh, strptr^,
  175.                                      module, version, revision, day, month, year, modsize, author) = -1 THEN
  176.                         PrintFault (Msg.msgCouldNotWriteLog);
  177.                         HALT (Dos.fail)
  178.                 END
  179.         END;
  180.  
  181.         CloseFile (logfh, TRUE)
  182. END WriteLog;
  183.  
  184.  
  185. PROCEDURE GetVersRev ();
  186. BEGIN
  187.         OpenFile (modrevfh, Dos.oldFile, module, modrevext);
  188.         modrevexists := modrevfh # NIL;
  189.  
  190.         (* Version *)
  191.         IF SYSTEM.VAL (LongIntPtr, argarray[versionOpt]) # NIL THEN
  192.                 liptr := SYSTEM.VAL (LongIntPtr, argarray[versionOpt]);
  193.                 version := liptr[0]
  194.         ELSE
  195.                 IF modrevexists THEN
  196.                         REPEAT        IO.Read (modrevfh, ch)
  197.                         UNTIL ch = "="; IO.Read (modrevfh, ch);
  198.                         IF ~ ReadLongInt (modrevfh, version) THEN
  199.                                 version := 0
  200.                         END
  201.                 ELSE        version := 0
  202.                 END
  203.         END;
  204.  
  205.         (* Revision *)
  206.         IF SYSTEM.VAL (LongIntPtr, argarray[revisionOpt]) # NIL THEN
  207.                 liptr := SYSTEM.VAL (LongIntPtr, argarray[revisionOpt]);
  208.                 revision := liptr[0]
  209.         ELSE
  210.                 IF modrevexists THEN
  211.                         REPEAT        IO.Read (modrevfh, ch)
  212.                         UNTIL ch = "="; IO.Read (modrevfh, ch);
  213.                         IF ~ ReadLongInt (modrevfh, revision) THEN
  214.                                 revision := 0
  215.                         END
  216.                 ELSE        revision := 0
  217.                 END;
  218.                 IF ~dateOnly THEN (* test added by fjc *)
  219.                         INC (revision)                (* Bump revision *)
  220.                 END;
  221.         END;
  222.  
  223.         CloseFile (modrevfh, TRUE)
  224. END GetVersRev;
  225.  
  226.  
  227. PROCEDURE GetDate;
  228. VAR
  229.         timeReqPtr: Timer.TimeRequestPtr;
  230.         sysTime: Timer.TimeVal;
  231.         success: BOOLEAN;
  232.         clockData: Utility.ClockData;
  233.         (* timerBase: Timer.TimerBasePtr; *)
  234. BEGIN
  235.         success := FALSE;
  236.         NEW (timeReqPtr);
  237.         IF timeReqPtr # NIL THEN
  238.                 IF Exec.OpenDevice (Timer.timerName, Timer.vBlank, timeReqPtr, {}) = 0 THEN
  239.                         Timer.base := timeReqPtr.node.device;
  240.                         Timer.GetSysTime (sysTime);
  241.                         Exec.CloseDevice (timeReqPtr);
  242.                         success := TRUE
  243.                 END
  244.         END;
  245.         IF ~success THEN
  246.                 HALT (20)
  247.         END;
  248.         Utility.Amiga2Date (sysTime.secs, clockData);
  249.         day := clockData.mday;
  250.         month := clockData.month;
  251.         year  := clockData.year MOD 100  (* only two digits for the year :-( *)
  252. END GetDate;
  253.  
  254.  
  255. PROCEDURE ParseArgs ();
  256. BEGIN
  257.         FOR li := 0 TO numOfArgs-1 DO
  258.                 argarray[li] := NIL
  259.         END;
  260.         argarray[logExtOpt] := SYSTEM.ADR (defLogExt);
  261.         argarray[revModExtOpt] := SYSTEM.ADR (defRevModExt);
  262.         argarray[modExtOpt] := SYSTEM.ADR (defModExt);
  263.         argarray[dateOnlyOpt] := defDateOnly; (* added by fjc *)
  264.  
  265.         strptr := Msg.GetString (Msg.msgTemplate);
  266.         argresult := Dos.OldReadArgs (strptr^, argarray, NIL);
  267.  
  268.         IF argresult = NIL THEN
  269.                 PrintFault (0);
  270.                 HALT (Dos.fail)
  271.         END;
  272.  
  273.         module := SYSTEM.VAL (Exec.LSTRPTR, argarray[moduleOpt]);
  274.         logext := SYSTEM.VAL (Exec.LSTRPTR, argarray[logExtOpt]);
  275.         modrevext := SYSTEM.VAL (Exec.LSTRPTR, argarray[revModExtOpt]);
  276.         modext := SYSTEM.VAL (Exec.LSTRPTR, argarray[modExtOpt]);
  277.         nolog := SYSTEM.VAL (LONGINT, argarray[noLogOpt]) # 0;
  278.         (* added by fjc *)
  279.         dateOnly := SYSTEM.VAL (LONGINT, argarray[dateOnlyOpt]) # 0
  280. END ParseArgs;
  281.  
  282.  
  283. PROCEDURE WriteCopyright ();
  284. BEGIN
  285.         strptr := Msg.GetString (Msg.msgCopyright);
  286.         IO.WriteF1 (NIL, strptr^, SYSTEM.ADR (OBumpRevRev.vers))
  287. END WriteCopyright;
  288.  
  289.  
  290. PROCEDURE *Close (VAR rc : LONGINT);
  291. BEGIN
  292.         Msg.CloseCatalog ();
  293.         Dos.FreeArgs (argresult);
  294.         CloseFile (modrevfh, FALSE);
  295.         CloseFile (logfh, FALSE);
  296.         CloseFile (modfh, FALSE)
  297. END Close;
  298.  
  299.  
  300. PROCEDURE Init ();
  301. BEGIN
  302.         modrevfh := NIL; logfh := NIL; modfh := NIL;
  303.         modrevexists := TRUE;
  304.         Kernel.SetCleanup (Close);
  305.         ASSERT (Utility.base # NIL, 100); (* Must open *)
  306.         Msg.OpenCatalog (NIL, "");
  307.  
  308.         SYSTEM.NEW (author, 32);
  309.         SYSTEM.NEW (logname, 32);
  310.         SYSTEM.NEW (module, 32);
  311.         SYSTEM.NEW (logext, 32);
  312.         SYSTEM.NEW (modrevext, 32);
  313.         SYSTEM.NEW (modext, 32);
  314.         SYSTEM.NEW (prgname, 32);
  315.  
  316.         IF ~ Dos.GetProgramName (prgname^, 30) THEN prgname := SYSTEM.ADR (programName) END;
  317. END Init;
  318.  
  319.  
  320. BEGIN        Init ();
  321.         WriteCopyright ();
  322.         ParseArgs ();
  323.  
  324.         GetDate ();
  325.         GetVersRev ();
  326.         WriteRevMod ();
  327.         IF ~ nolog THEN WriteLog () END;
  328.         strptr := Msg.GetString (Msg.msgBumpedTo);
  329.         IO.WriteF4 (NIL, strptr^, prgname, module, version, revision)
  330. END OBumpRev.
  331.  
  332.